package com.tedu.api.thread;

/**
 * 线程常用API：四
 * join()    线程同步
 * 作用：允许一个线程在另外一个线程上等待，执行完毕上一个线程，执行当前线程！
 *
 * join常用在线程协调之间同步操作！
 *
 * 同步运行：执行先后顺序
 * 异步运行：执行代码没有先后顺序，各自执行自己的代码块(多线程)
 *
 * 需求：模拟下载功能：下载"图片"---1%~100%----单一流程：线程---共享状态变量
 *                  【下载完毕之后】
 *                  显示"图片"----单一流程：线程---共享状态变量
 *  同步运行：执行完毕下载图片操作，显示图片操作
 */
public class Thread_join {
    //图片是否下载完毕：共享状态变量---线程同步|true下载完毕，false没有下载
    public static boolean isFinish=false;

    public static void main(String[] args) {
        //1.创建 下载线程，功能：1%~100% 下载百分比 download
        System.out.println("下载：开始下载图片：");
        Thread download=new Thread(()->{
            for (int i=1;i<=100;i++){
                System.out.println("下载："+i+"%");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            isFinish=true;  //当百分比到100%  下载状态改为true  下载完毕
        });
        download.start();
        //1.创建 显示线程，功能：显示图片 下载完毕之后显示 show
        System.out.println("准备显示图片中....");
        Thread show=new Thread(()->{
            //2.在显示图片前，必须下载完毕图片
            try {
                download.join();  //同步：先执行download在执行show
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //3.如果图片没有下载完毕，---提示：打开失败，主动抛出异常
            if(!isFinish){  //false--图片正常下载--提示
                throw new RuntimeException("加载图片失败~~");
            }
            System.out.println("恭喜：图片加载完毕~");
        });
        show.start();
    }
}
